AquaX Deployment Plan

Owner: DevOps
Reviewers: Backend, Frontend, Mobile, QA, Security, Operations
Status: Draft - Current-Code Baseline
Version: 0.1
Last Updated: 2026-09-17
Review Cycle: Per release, infrastructure change, or deployment workflow change

1. Muc Dich Va Pham Vi

Tai lieu nay mo ta ke hoach trien khai AquaX theo trang thai code hien tai. Noi dung duoc tong hop tu docker-compose.yml, docker-compose.iot.yml, .github/workflows/, k8s/, cac Dockerfile, cac file .env.example, script mobile va cac tai lieu DevOps/Operations dang co.

Pham vi bao gom:

Pham vi chua duoc code xac nhan day du:

2. Tom Tat Trang Thai Deployment Hien Tai

Hang muc Trang thai Chung cu code
Local full stack CONFIRMED docker-compose.yml
Local IoT stack rieng CONFIRMED docker-compose.iot.yml
Backend Docker dev/runtime CONFIRMED backend/Dockerfile
Backend Docker production CONFIRMED backend/Dockerfile.prod
Web Docker image PARTIAL web/Dockerfile dang chay Vite dev server, chua phai static production serving
IoT worker Docker image CONFIRMED iot-worker/Dockerfile
Backend VM/Docker Compose production CONFIRMED BY INFRA UPDATE Production hien dang trien khai tren VM; repo co ST United VM workflow cho dev
Backend Kubernetes/GKE dev/prod manifests OPTIONAL k8s/base, k8s/services-dev, k8s/services-prod
Backend CI CONFIRMED .github/workflows/ci.yml
Backend GKE CD OPTIONAL/PARTIAL .github/workflows/cd-api.yml, co diem lech trigger dev
Backend ST United VM CD PARTIAL .github/workflows/cd-api-stunited-registry.yml hien tu dong cho dev; production VM flow can bo sung/ghi ro
Mobile Android Play Store upload PARTIAL mobile/scripts/deploy_android_playstore.sh
Monitoring provider TBD Chua co provider/dashboard production trong repo
Backup/DR TBD Co skeleton docs, chua co policy/automation production

3. Deployment Topology

3.1 Local Development

Local integrated stack trong docker-compose.yml gom:

Service Image/Build Port Vai tro
postgres timescale/timescaledb:latest-pg15 5432 PostgreSQL/TimescaleDB cho app va telemetry
mosquitto eclipse-mosquitto:2 1883 MQTT broker local
telegraf telegraf:1.35-alpine internal MQTT to PostgreSQL ingestion
iot-worker ./iot-worker internal Xu ly telemetry/heartbeat/command ack
redis redis:7-alpine 6379 Session/cache backend
backend ./backend 3001 NestJS API, Prisma migration/seed/build/start
frontend ./web 5173 Vite React dev server

3.2 Local IoT Stack

docker-compose.iot.yml phuc vu luong IoT rieng:

3.3 VM/Docker Compose Backend - Production Path Hien Tai

Production infrastructure hien tai dang chay tren VM, khong phai Kubernetes. Do do deployment plan chinh cho production can uu tien:

Repository hien co workflow VM cho dev:

Production VM gap can bo sung:

3.4 Kubernetes Backend - Optional/Reference Path

Kubernetes stack trong k8s/ hien duoc giu nhu optional path/reference, khong con la production path chinh sau thay doi ha tang sang VM:

K8s chi nen dung khi du an quyet dinh quay lai GKE/Kubernetes hoac can moi truong song song.

3.5 Registry Va Server Deployment

Hien co hai luong CD backend trong repo, nhung production hien tai nen di theo VM/Docker Compose:

Workflow Target Trigger Ghi chu
.github/workflows/cd-api-stunited-registry.yml docker-gateway.stunited.vn + SSH deploy VM push vao dev va workflow_dispatch Build backend/Dockerfile.prod, push dev-* va dev-latest, deploy bang Docker Compose tren ST United VM
.github/workflows/cd-api.yml GCP Artifact Registry + GKE push vao main theo paths backend/k8s/workflow Optional/reference; khong con la production path chinh khi prod chay VM

4. Moi Truong

Moi truong Muc dich Domain/port Trang thai
Local app Development tich hop API localhost:3001, web localhost:5173, DB localhost:5432, Redis localhost:6379, MQTT localhost:1883 CONFIRMED
Local IoT Kiem thu ingestion IoT rieng IoT DB localhost:5433, MQTT localhost:1883 CONFIRMED
VM dev Backend API dev tren VM/ST United Deploy dir default /home/stunited/st-projects/aquax/dev CONFIRMED
VM prod Backend API production tren VM Domain/port theo cau hinh VM production CONFIRMED BY INFRA UPDATE
K8s dev Backend API dev optional https://dev.api.aquax.vn OPTIONAL
K8s prod Backend API production optional https://api.aquax.vn OPTIONAL
Web dev/admin Admin portal https://dev.admin-portal.aquax.vn, https://admin-portal.aquax.vn trong CORS/env PARTIAL, production deploy target chua xac nhan
Mobile Android Google Play tracks internal, alpha, beta, production PARTIAL
Mobile iOS App Store/TestFlight TBD PLANNED/TBD

5. Artifact Va Build Strategy

5.1 Backend API

Production artifact:

Manual build example:

cd backend
docker build --platform linux/amd64 -f Dockerfile.prod -t aquax-api .

5.2 Web Admin Portal

Current artifact:

Production gap:

5.3 IoT Worker

Artifact:

Production/VM gap:

5.4 Mobile

Android:

iOS:

5.5 AI Engine

Current state:

Deployment gap:

6. Configuration Va Secrets

6.1 Backend Environment

Backend .env.example confirms these groups:

Production rules:

6.2 Web Environment

Web .env.example confirms:

Production rule:

6.3 VM Secrets

Production VM deployment must use an environment file or server-side secret mechanism outside git:

6.4 K8s Secrets - Optional Path

K8s optional path uses:

Optional K8s gap/risk:

7. Database Migration Va Seed Strategy

7.1 Local

docker-compose.yml backend command currently runs:

npm ci &&
npx prisma generate &&
npx prisma migrate deploy &&
npx prisma db seed &&
npm run build &&
node dist/main

Implication:

7.2 VM Production

Production VM deployment should run migrations as a controlled deployment step:

7.3 Kubernetes - Optional

Deployment rule:

8. CI/CD Plan

8.1 Continuous Integration

Workflow: .github/workflows/ci.yml.

Triggers:

Checks:

Job Checks
Branch rules PR source/target branch validation
Branch name Naming convention warning
Commitlint PR title and commit messages
Backend npm ci, Prisma generate, lint, build, test
Web npm ci, lint, build/type check

Current CI gaps:

8.2 VM CD

Current VM workflow: .github/workflows/cd-api-stunited-registry.yml.

Confirmed dev path:

  1. Trigger on push to dev or manual dispatch.
  2. Build backend/Dockerfile.prod.
  3. Push dev-<date>-<sha> and dev-latest to docker-gateway.stunited.vn/aquax-api.
  4. SSH to ST United VM.
  5. Login to registry on VM.
  6. In deploy dir, run docker compose -f docker-compose.yml pull aquax-api-dev.
  7. Run docker compose -f docker-compose.yml up -d aquax-api-dev.
  8. Run docker compose -f docker-compose.yml ps.

Production VM path to add/confirm:

8.3 GKE CD - Optional

Workflow: .github/workflows/cd-api.yml.

Optional GKE path:

  1. Trigger on push to main for backend/k8s/workflow path changes.
  2. Build backend/Dockerfile.prod.
  3. Push image to GCP Artifact Registry.
  4. Authenticate to GKE.
  5. Apply Kustomize overlay.
  6. Wait for statefulset/aquax-api rollout.
  7. Rollback workflow job exists for production failure handling.

Known optional-workflow issue:

Required secrets:

9. Deployment Runbooks

9.1 Local Integrated Stack

Prerequisites:

Run:

docker compose up --build

Verify:

curl http://localhost:3001/api/health
open http://localhost:5173

Stop:

docker compose down

9.2 Local IoT Stack

Run:

docker compose -f docker-compose.iot.yml up --build

Verify:

9.3 VM Backend Deployment

Prerequisites:

Generic deploy flow:

cd /path/to/aquax/deploy
docker compose -f docker-compose.yml pull <api-service-name>
docker compose -f docker-compose.yml up -d <api-service-name>
docker compose -f docker-compose.yml ps
docker compose -f docker-compose.yml logs --tail=200 <api-service-name>

Verify:

curl https://<api-domain>/api/health

Rollback:

# Set previous image tag in VM compose/env, then:
docker compose -f docker-compose.yml pull <api-service-name>
docker compose -f docker-compose.yml up -d <api-service-name>

9.4 K8s Dev Backend - Optional

Prerequisites:

Deploy:

kubectl apply -k k8s/services-dev
kubectl -n aquax-dev rollout status statefulset/aquax-api

Verify:

kubectl -n aquax-dev get pods,svc,ingress
curl https://dev.api.aquax.vn/api/health

9.5 K8s Production Backend - Optional

Prerequisites:

Deploy:

kubectl apply -k k8s/services-prod
kubectl -n aquax-prod rollout status statefulset/aquax-api

Verify:

kubectl -n aquax-prod get pods,svc,ingress
curl https://api.aquax.vn/api/health

9.6 Android Release

Prerequisites:

Run internal track:

cd mobile
./scripts/deploy_android_playstore.sh internal

Allowed tracks:

Release rule:

10. Pre-Deployment Checklist

Check Dev Prod
CI passes for backend/web Required Required
Prisma migration reviewed Required when schema changes Required
DB backup available Recommended Required
Secrets updated and not committed Required Required
CORS origins match frontend domains Required Required
IOT_INGEST_TOKEN configured Required if IoT ingest enabled Required
Redis configured Recommended Required for session consistency
GCS bucket/credentials configured Required if uploads enabled Required if uploads enabled
Health endpoint available Required Required
Rollback image tag known Recommended Required
VM .env and compose service verified Required for VM envs Required
Monitoring/alerting active Recommended Required before public production

11. Post-Deployment Verification

Minimum smoke tests:

Area Verification
API health GET /api/health returns healthy status
Auth Login, refresh, logout, current user
Tenant/farm context User can access allowed farm/pond only
Water quality Create/list readings if environment supports it
Feeding Create/list feeding logs if role allows
IoT ingest Telemetry endpoint accepts valid token and rejects invalid token
Device command Manual command creates MQTT publish path when configured
File upload/report GCS-backed flows work when credentials configured
Email Forgot password sends/logs token according to environment provider
Web Admin portal points to correct VITE_API_BASE_URL
Mobile Mobile app points to correct API and login flow works

VM verification commands:

docker compose -f docker-compose.yml ps
docker compose -f docker-compose.yml logs --tail=200 <api-service-name>
curl https://<api-domain>/api/health

Optional K8s verification commands:

kubectl -n aquax-prod get pods
kubectl -n aquax-prod describe statefulset aquax-api
kubectl -n aquax-prod logs statefulset/aquax-api -c aquax-api --tail=200
kubectl -n aquax-prod logs statefulset/aquax-api -c db-migration --tail=200

12. Rollback Plan

Application rollback:

  1. Identify last healthy image tag.
  2. Confirm schema compatibility with current database.
  3. For VM production, point Docker Compose/env to the previous healthy image tag.
  4. Pull/restart the VM service with Docker Compose.
  5. For optional K8s only, update image tag in Kustomize overlay and apply it.
  6. Run smoke tests.
  7. Record incident, impact and follow-up actions.

Database rollback:

VM rollback examples:

# On VM: point compose/env to the previous image tag, then restart service.
docker compose -f docker-compose.yml pull <api-service-name>
docker compose -f docker-compose.yml up -d <api-service-name>
docker compose -f docker-compose.yml logs --tail=200 <api-service-name>

Optional K8s rollback examples:

kubectl -n aquax-prod rollout history statefulset/aquax-api
kubectl -n aquax-prod rollout undo statefulset/aquax-api

Notes:

13. Monitoring, Logging Va Alerting

Signals to monitor:

Current gap:

Recommended minimum alerts:

Alert Suggested threshold
API unavailable /api/health fails for 3 consecutive checks
VM container restart loop API container restarts repeatedly within 10 minutes
K8s pod crash loop, optional Any production API pod restarts repeatedly within 10 minutes when K8s is used
DB unavailable PostgreSQL connection failure from API/init check
Redis unavailable Redis connection failure when Redis is required
Disk pressure DB/storage usage over approved threshold
IoT ingestion stalled No telemetry processed for expected active pond/device window
Error spike 5xx rate exceeds agreed SLO

14. Disaster Recovery Va Backup

Recovery scope:

Current gap:

Minimum policy to define before production:

Item Required decision
RPO Maximum acceptable data loss
RTO Maximum acceptable downtime
DB backup Schedule, retention and restore test
File storage backup Bucket versioning/retention policy
Secret recovery Owner and recovery process
DR drill Frequency and pass/fail checklist

15. Security Controls Trong Deployment

Confirmed controls:

Controls to add/confirm:

16. Known Gaps Va Action Items

ID Gap Impact De xuat
DEP-01 Production hien chay VM nhung repo moi co workflow VM cho dev Prod deploy automation/runbook chua du code xac nhan Tao workflow/runbook production VM rieng
DEP-02 Web Dockerfile chay Vite dev server Chua san sang production hosting Tao production static build/serve plan
DEP-03 Web production deployment target chua xac nhan Admin portal release chua co runbook day du Chon CDN/static hosting/K8s/managed hosting
DEP-04 Mobile CI/CD chua co trong GitHub Actions Mobile release phu thuoc script local/manual Them lint/typecheck/build va release workflow neu can
DEP-05 IoT production topology tren VM TBD MQTT/worker production chua co SLO/runbook Thiet ke broker, worker, telegraf, security va scale plan tren VM hoac service rieng
DEP-06 Monitoring provider/dashboard TBD Kho phat hien incident som Chon provider va tao dashboard/alerts
DEP-07 Backup/RPO/RTO TBD Rui ro mat du lieu/keo dai downtime Dinh nghia DR policy va restore drill
DEP-08 JWT key strategy tren VM/prod chua duoc tai lieu hoa Restart/deploy co the anh huong token neu key khong on dinh Luu key on dinh bang file secret/secret manager va backup an toan
DEP-09 Local compose auto seed khi start backend Khong phu hop production neu copy sai Giu chi local; production chi migrate deploy
DEP-10 AI engine chua co runtime deployment Chua the deploy AI service/model Dinh nghia AI service/job/model artifact khi AI feature duoc implement
DEP-11 K8s/GKE workflow van ton tai nhung khong con la production path chinh Team co the deploy nham ha tang Danh dau optional trong docs/workflows hoac disable neu khong dung

17. Traceability

Source Noi dung duoc su dung
docker-compose.yml Local full-stack deployment
docker-compose.iot.yml Local IoT stack
backend/Dockerfile Backend development/container baseline
backend/Dockerfile.prod Backend production image
web/Dockerfile Web container current state
iot-worker/Dockerfile IoT worker image
.github/workflows/ci.yml CI checks
.github/workflows/cd-api.yml GKE backend CD
.github/workflows/cd-api-stunited-registry.yml ST United registry/server CD
k8s/README.md Kubernetes deployment notes
k8s/base Backend K8s base resources
k8s/services-dev Dev overlay
k8s/services-prod Prod overlay
backend/.env.example Backend config/secrets baseline
web/.env.example Web config baseline
iot-worker/.env.example IoT worker config baseline
mobile/app.json Mobile app identity/build config
mobile/scripts/deploy_android_playstore.sh Android Play Store release script
docs/07-devops/* Existing DevOps notes
docs/09-operations/* Existing Operations notes